<?php

/**
 * Klasa tworząca formatki
 *
 * Zmienione domyślne dekoratotory, dodano fieldseta
 *
 * @category   core
 * @package    core
 * @copyright  Copyright (c) 2008 Kuśmierz Adam
 */

class Core_Form extends Zend_Form
{
	/**
	 * Load the default decorators
	 *
	 * @return void
	 */
	public function loadDefaultDecorators()
	{
		if ($this->loadDefaultDecoratorsIsDisabled()) {
			return;
		}
		// domyslne dekoratory
		$decorators = $this->getDecorators();
		if (empty($decorators)) {
			// jasne...
			$this->addDecorator('FormElements')
				->addDecorator('Form');
			// fieldset dodajemy itp
			$this->setDecorators(array(
				'FormElements',
				'Fieldset',
				'Form'
				));
		}
	}

	/**
	 * Render form
	 *
	 * @param  Zend_View_Interface $view
	 * @return string
	 */
	public function render(Zend_View_Interface $view = null)
	{
		$formId = $this->getName();
		$order = 0;
		foreach ($this->getElements() as $element) {
			++ $order;
			
			// zmieniamy ID wszystkich elementow, zaleznie od ID formatki,
			// zeby zmniejszyc liczbe konfliktow (takie samo ID)
			if (!empty($formId)) {
				$oldName = $element->getName();
				$newName = $formId . '_' . $oldName;
				// $element->setName($newName);
				$element->setAttrib('id', $newName);
			} else
				$oldName = $newName = $element->getName();
			
			// szukamy elementow z odpowiednimi dekoratorami
			$dtdd = null;
			if ($element->getDecorator('HtmlTag') instanceof Zend_Form_Decorator_HtmlTag)
				$dtdd = $element->getDecorator('HtmlTag');
			else if ($element->getDecorator('Label') instanceof Zend_Form_Decorator_Label)
				$dtdd = $element->getDecorator('Label');
			
			// zmieniamy (brzydko!) domyslne dekoratory
			if ($dtdd && ($dtdd->getOption('tag') === 'dd' || $dtdd->getOption('tag') === 'dt')) {
				// dodajemy klase helper + nazwa elementu
				if (!empty($oldName))
					$class = array('helper', $oldName);
				else
					$class = array();
				
				// dodajemy klasy dla elementow parzystych i nieparzystych
				if ($order % 2 != 0)
					$class[] = 'odd';
				else
					$class[] = 'even';
				
				// zmieniamy kolejnosc dekoratorow i zmieniamy tagi z dd na div (wszystko opakowujemy w div)
				
				if ($element->getDecorator('Label') instanceof Zend_Form_Decorator_Abstract)
					$element->getDecorator('Label')->removeOption('tag');
					
				if ($element->getDecorator('HtmlTag'))
					$element->addDecorator('HtmlTag', array('tag' => 'div', 'class' => implode(' ', $class)));
				
				$element->addDecorator('Description');
				// wylaczamy domyslne escapowanie kodu html w labelkach
				$element->getDecorator('Label')->setOption('escape', false);
			} else if ($element->getDecorator('DtDdWrapper')) {
				// zmieniamy domyslne dl i dd na div
				$element->removeDecorator('DtDdWrapper');
				$element->addDecorator('Description');
				$element->addDecorator('HtmlTag', array('tag' => 'div'));
			}
			
			// dodaj klasę submit do submitów, zeby bylo je latwiej wybierac
			if ($element instanceof Zend_Form_Element_Submit) {
				//$element->addDecorator('Description');
				if (is_null($element->getAttrib('class')))
					$element->setOptions(array('class' => 'submit'));
			}
		}
		return parent::render($view);
	}
}